﻿#ifndef PIN_H
#define PIN_H

#include "baseelement.h"

//Тип коннектора
enum PinType
{
  PinType_In = 0,
  PinType_Out = 1,
  PinType_Other = 2
};

struct PinActiveRegion
{
    // Параметрый активной области пина
    QPoint topLeftPoint;

    int width;
    int height;

    // Точка от которой вести соединение
    QPoint bindPoint;
};

//Коннектор элементов схемы
class Pin : public BaseElement
{
    Q_OBJECT

private:
    void init();

public:
    Pin();
    Pin(BaseElement *parent);
    ~Pin();

    // =========== Fields =========

    //Подключённый пин
    Pin *friendPIN;

    //Схема к которой относится
    BaseElement *parentElement;

    //Сигнал
    signed char signal;

    //Вход или вывод
    PinType type;

    //Сигнал по умолчанию
    signed char defaultSignal;

    //Разрешение выхода
    bool outEnabled;

    //Индекс в таблице истинности
    int index;

    // Разметка активного региона
    PinActiveRegion activeRegion;

    // =========== Methods =========

    //Отправить сигнал дружественному пину
    void send(signed char signal);

    //Принять сигнал
    void receive(signed char signal);

    //Вернуться в начальное состояние
    void refresh();

    //Отсоединить подключенный пин
    void disconnectPin();

    //Поключить пин
    void connectPin(Pin *pin);

    //Убрать подключенные события
    void dropEvents();

    //Тип пина
    QString typeToString();

    //Соединить два пина
    static void unite(Pin *one,Pin *two);

signals:
    //Событие по отправке сигнала
    void onSend(const Pin *sender, signed char signal);

    //Событие по приёму сигнала
    void onReceive(const Pin *sender, signed char signal);
};

#endif // PIN_H
